package jdk_interface;

/**
 * @author yuisama
 * @date 2022/09/18 20:05
 * 当Student类实现了Comparable接口之后，就具备了可比较的能力
 * 根据compareTo方法的返回值，JVM就知道哪个Student对象谁大谁小了
 **/
public class Student implements Comparable,Cloneable{
    private String name;
    private int score;

    public Student clone() throws CloneNotSupportedException {
        return (Student) super.clone();
    }

    public static void main(String[] args) throws CloneNotSupportedException {
        Student student = new Student("test",10);
        Student student1 = student.clone();
        student1.showStu();
        student.showStu();
    }

    public void showStu() {
        System.out.println(this.name + ":" + this.score);
    }

    public Student(String name, int score) {
        this.name = name;
        this.score = score;
    }

    public int getScore() {
        return score;
    }

    @Override
    public int compareTo(Object o) {
        // 向下转型，还原o的Student引用
        // 因为此时需要比较当前对象this和传入对象o的score谁大谁小！
        Student stu = (Student) o;
        if (this.score > stu.score) {
            return -1;
        } else if (this.score < stu.score) {
            return 1;
        } else {
            return 0;
        }
    }
//    @Override
//    // toString方法是Object类的方法，子类覆写此方法就可以决定自己的在println方法中的输出结果
//    public String toString() {
//        return "name = " + name + ",score = " + score;
//    }
    // 万能的alt + insert(enter)

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", score=" + score +
                '}';
    }

    // 直接在IDEA子类中写父类方法名称即可
    @Override
    public boolean equals(Object obj) {
        // 1.判断obj和当前对象的关系
        if (this == obj) {
            // 这两个引用是同一个对象，没得比，当然属性值相同！
            return true;
        }
        // 2.脱掉obj的外衣，看看它是不是Student类型，都不是一个类型，没有可比性
        // 包含了null情况 null 不属于任何类型！
        if (!(obj instanceof Student)) {
            // 此时obj就不是Student类型的引用，没有可比性！
            return false;
        }
        // 3.obj确实是Student类型的对象且和this当前对象不是同一个对象
        // 向下转型还原Student类型
        Student stu = (Student) obj;
        return this.name.equals(stu.name) && this.score == stu.score;
    }
}